#include "stdlib.h"
#include "stdio.h"
#include "stdint.h"

#define DEBUG 1

struct _ListNode;

#ifndef DUAL_LINK_LIST
#define DUAL_LINK_LIST 1

typedef struct _ListNode* p_ListNode;
typedef struct _ListNode ListNode;
typedef void (*ListDataPrintFunc)(void* data);

#endif

p_ListNode get_node(p_ListNode list, int index);
int8_t get_element(p_ListNode list, int index, void* data);
int get_length(p_ListNode list);
p_ListNode get_next_node(p_ListNode p_node);
void* get_additional_message(p_ListNode p_node);
void* get_data(p_ListNode p_node);
p_ListNode create_node(void* data);
int8_t insert_node(p_ListNode list, int index, void* data);
int8_t delete_node_by_index(p_ListNode list, int index, void* data);
int8_t delete_node_by_pointer(p_ListNode p_node);
void destroy_link_list(p_ListNode list);
void print_list(p_ListNode list, ListDataPrintFunc print_data);
int8_t set_additional_message_for_node(p_ListNode p_node, void* message);

